package com.unbox.auth.configuration.service;
import com.unbox.admin.entity.Menu;
import com.unbox.admin.entity.UnboxUser;
import com.unbox.admin.fegin.MenuFegin;
import com.unbox.admin.fegin.UnBoxUserFegin;
import com.unbox.common.auth.OAth2Role;
import com.unbox.common.auth.OAuth2User;
import com.unbox.common.response.UnboxResponse;
import com.unbox.common.util.UnBoxUtils;
import com.unbox.common.util.UnboxLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service(value = "oauth2UserService")
public class OAuth2UserServiceImpl implements UserDetailsService {

    // 国际化日志输出
    UnboxLog unboxLog = new UnBoxUtils.LocaleMessageLog(OAuth2UserServiceImpl.class);

    @Autowired
    UnBoxUserFegin unBoxUserFegin;

    @Autowired
    MenuFegin menuFegin;

    /**
     * 获取权限信息
     * @param menu
     * @return
     */
    private List<OAth2Role> getRoles(Menu menu) {
        List<OAth2Role> oAth2Roles = new ArrayList<>();
        for(Menu menu1: menu.getChildren()) {
            OAth2Role oAth2Role = new OAth2Role();
            oAth2Role.setName(menu1.getJurisdiction());
            oAth2Role.setId(menu1.getMenuId());
            oAth2Roles.add(oAth2Role);
            for(Menu menu2: menu1.getChildren()) {
                oAth2Role = new OAth2Role();
                oAth2Role.setName(menu2.getJurisdiction());
                oAth2Role.setId(menu2.getMenuId());
                oAth2Roles.add(oAth2Role);
                oAth2Roles.addAll(getRoles(menu2));
            }
        }
        return oAth2Roles;
    }

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        UnboxUser unboxUser = new UnboxUser();
        unboxUser.setUserName(s);
        OAuth2User oAuth2User = null;
        try {
            UnboxResponse<UnboxUser> unboxUserUnboxResponse = unBoxUserFegin.info(unboxUser);
            unboxUserUnboxResponse.checkCodeThrowExcetion();
            unboxUser = unboxUserUnboxResponse.getBody();

            // 获取菜单列表
            UnboxResponse<List<Menu>> menuResponse = menuFegin.getUserMenuList(unboxUser.getId());
            menuResponse.checkCodeThrowExcetion();
            List<Menu> menus = menuResponse.getBody();

            // 获取权限
            List<OAth2Role> ath2Roles = new ArrayList<>();
            for(Menu menu: menus) {
                ath2Roles.addAll(getRoles(menu));
            }

            // 过滤数据
            ath2Roles = ath2Roles.stream().filter(oAth2Role -> !StringUtils.isEmpty(oAth2Role.getName())).collect(Collectors.toList());

            // 封装用户验证信息
            oAuth2User = new OAuth2User(unboxUser.getUserName(), unboxUser.getPassWord(), ath2Roles);
            if(unboxUser.getUserState().equals(1)) {
                oAuth2User.setEnabled(false);
            } else {
                oAuth2User.setEnabled(true);
            }

            unboxUser.setLoginNum(unboxUser.getLoginNum() + 1);
            unboxUser.setLoginTime(LocalDateTime.now());
            unBoxUserFegin.update(unboxUser);
        } catch (Exception e) {
            unboxLog.error("auth.call.user.service.check.error",e.getMessage());
        }
        return oAuth2User;
    }
}
